package modelo.dao.implementacion;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;
import java.sql.Date;

import modelo.dao.ReservasDAO;
import modelo.transfer.EstadoMesa;
import modelo.transfer.Mesa;
import modelo.transfer.Reserva;
import modelo.transfer.Salon;
import modelo.transfer.Socio;

public class Reservas implements ReservasDAO {

	private ArrayList<Reserva> reservas = new ArrayList<Reserva>();
	private boolean actualizado = false;

	@Override
	public ArrayList<Reserva> verReservas() {
		if (actualizado){
			return reservas;
		}
				
		String sql = "SELECT * FROM reservas, socios, mesas "
				+ "WHERE reservas.dni_socio = socios.dni_socio AND"
				+ " reservas.id_mesa = mesas.id_mesa";
		
		try {
			ConectorBBDD.iniciarConexion();
			ResultSet rs = ConectorBBDD.realizarConsulta(false, sql);

			System.out.println("comprobando resultado consulta...");
			if (rs != null){
				
				System.out.println("creando arraylist de reservas...");

				reservas.clear();
				
				do {
					
					Date fecha = rs.getDate("fecha");
					Mesa mesa = new Mesa(rs.getInt("mesas.id_mesa"), 
										rs.getInt("numero_sillas"), 
										rs.getInt("numero_comensales"), 
										EstadoMesa.valueOf(rs.getString("estado")),
										null);
					Socio socio = new Socio(rs.getString("nombre"),
											rs.getString("direccion"), 
											rs.getString("dni_socio"),
											rs.getInt("telefono")+"");
					
					modelo.transfer.Reserva nuevaReserva = 
							new modelo.transfer.Reserva(rs.getInt("id_reserva"),
									rs.getInt("num_comensales"),
									mesa, fecha, socio);									
					
					reservas.add(nuevaReserva);
				} while (rs.next());

				actualizado = true;

				ConectorBBDD.cerrarConexion();
				
				return reservas;
			}			
			
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {			
			e.printStackTrace();
		}
		
		
		
		return null;
	}	

	// CORREGIDO

	@Override
	public boolean eliminarReserva(int numReserva) {
		String sql = "DELETE FROM reservas WHERE id_reserva="+numReserva;		
		try {
			ConectorBBDD.iniciarConexion();
			ResultSet rs = ConectorBBDD.realizarConsulta(true, sql);
			if (rs != null){
				actualizado = false;
				ConectorBBDD.cerrarConexion();
				return true;
			}
			ConectorBBDD.cerrarConexion();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {			
			e.printStackTrace();
		}		
		return false;
	}

	@Override
	public Reserva hacerReserva(String dniSocio, int numMesa, int numComensales, Date fecha) {
		
		Date fechaMax = new Date(fecha.getTime()+TimeUnit.HOURS.toMillis(1));
		
		java.text.SimpleDateFormat sdf = 
			     new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		String sql = "SELECT COUNT(*) as cantidad "
					+ "FROM reservas WHERE fecha >= '"+sdf.format(fecha)+
					"' AND fecha <= '"+sdf.format(fechaMax) + "' AND "+
					" id_mesa="+numMesa;

		try {
			ConectorBBDD.iniciarConexion();
			ResultSet rs = ConectorBBDD.realizarConsulta(false, sql);
			if (rs.getInt("cantidad") > 0){
				ConectorBBDD.cerrarConexion();
				return null;
			}
			
			// Si no estaba reservada esa mesa en esa hora, se reserva.
			sql = "INSERT INTO reservas (`fecha`, `dni_socio`, `num_comensales`, `id_mesa`) "
					+ "VALUES ('" + sdf.format(fecha) + "','" +
					dniSocio + "','" +
					numComensales + "','" +
					numMesa + "')";
			
			rs = ConectorBBDD.realizarConsulta(true, sql);

			if (rs != null){
				actualizado = false;
				ConectorBBDD.cerrarConexion();
				
				/*Mesa mesa = new Mesa(rs.getInt("id_mesa"), 
									rs.getInt("numero_sillas"), 
									rs.getInt("numero_comensales"), 
									null,
									null);
				Socio socio = new Socio(null, null, rs.getString("dni_socio"),
										null);
			
				modelo.transfer.Reserva nuevaReserva = 
						new modelo.transfer.Reserva(rs.getInt("id_reserva"),
								numComensales,
								mesa, fecha, socio);*/	
				
				return null;//nuevaReserva;
				
				
			}
			
			
			ConectorBBDD.cerrarConexion();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {			
			e.printStackTrace();
		}		
		
		return null;
	}

	@Override
	public Reserva modificarReserva(int numReserva, String dniSocio,
			int numMesa, int numComensales, Date fecha) {
		
		java.text.SimpleDateFormat sdf = 
			     new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		String sql = "UPDATE `reservas` SET"+
				" `fecha`= '"+sdf.format(fecha)+
				"',`dni_socio`='"+dniSocio+
				"',`num_comensales`='"+numComensales+
				"',`id_mesa`='"+numMesa+
				"' WHERE id_reserva="+numReserva;
		
		try {
			ConectorBBDD.iniciarConexion();
			ResultSet rs = ConectorBBDD.realizarConsulta(true, sql);
			if (rs != null){
				actualizado = false;
				Mesa mesa = new Mesa(rs.getInt("id_mesa"), 
						rs.getInt("numero_sillas"), 
						rs.getInt("numero_comensales"), 
						null,
						null);
				Socio socio = new Socio(rs.getString("nombre"),
										rs.getString("direccion"), 
										rs.getString("dni_socio"),
										rs.getInt("telefono")+"");
				
				modelo.transfer.Reserva nuevaReserva = 
						new modelo.transfer.Reserva(rs.getInt("id_reserva"),
								rs.getInt("num_comensales"),
								mesa, fecha, socio);	

				ConectorBBDD.cerrarConexion();
				return nuevaReserva;
			}
			ConectorBBDD.cerrarConexion();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {			
			e.printStackTrace();
		}		
		
		return null;
	}

	/// DEPRECADOS


	@Override
	public Object hacerReserva(int numSillas, Mesa mesa, String cliente,
			String telefono, Date fecha) {
		return null;
	}

	@Override
	public Salon eliminarReserva(int numReserva, String DNI) {
		return null;
	}

	@Override
	public Reserva modificarReserva(int numReserva, String DNI, Reserva reserva) {
		return null;
	}
	

}
